package com.beikai.springbootsortint.xunze;

import org.junit.Test;

import java.util.Arrays;

/**
 * @ClassName XuanZeSorting
 * @Description TODO
 * @Author Admin
 * @Date 2019/1/29 16:46
 * @Version 1.0
 *  选择排序   地址:https://www.javazhiyin.com/13397.html
 **/
public class XuanZeSorting {

    /**
     * 选择排序法
     *      选择排序法也是分为内外循环
     *          外循环选择被比较的数
     *          内循环选择比较的数
     *
     *          每一次外循环选择一个数,内循环选择这个数后面的所有的数,后面所有的数与外循环选择的数进行对比
     *          如果比外循环选择的数大或者小,位置进行交换,以达到排序的目的
     *
     *          内循环的起点比外循环被比较的数大一位,即被比较的数后面一位的数
     *          所以 内循环的起点是 i + 1
     *
     *          比较的次数:
     *              数组的长度为奇数 : arr.length * ((arr.length-1)/2)
     *              数组的长度为偶数 : (arr.length - 1) * ((arr.length)/2)
     *
     * i的大小是 -----------> 0
     * j的大小是 ---> 1
     * 此时数组排序状况是 : [1, 4, 2, 5, 2, 4, 7, 5]
     * j的大小是 ---> 2
     * 此时数组排序状况是 : [1, 4, 2, 5, 2, 4, 7, 5]
     * j的大小是 ---> 3
     * 此时数组排序状况是 : [1, 4, 2, 5, 2, 4, 7, 5]
     * j的大小是 ---> 4
     * 此时数组排序状况是 : [1, 4, 2, 5, 2, 4, 7, 5]
     * j的大小是 ---> 5
     * 此时数组排序状况是 : [1, 4, 2, 5, 2, 4, 7, 5]
     * j的大小是 ---> 6
     * 此时数组排序状况是 : [1, 4, 2, 5, 2, 4, 7, 5]
     * j的大小是 ---> 7
     * 此时数组排序状况是 : [1, 4, 2, 5, 2, 4, 7, 5]
     * i的大小是 -----------> 1
     * j的大小是 ---> 2
     * 此时数组排序状况是 : [1, 2, 4, 5, 2, 4, 7, 5]
     * j的大小是 ---> 3
     * 此时数组排序状况是 : [1, 2, 4, 5, 2, 4, 7, 5]
     * j的大小是 ---> 4
     * 此时数组排序状况是 : [1, 2, 4, 5, 2, 4, 7, 5]
     * j的大小是 ---> 5
     * 此时数组排序状况是 : [1, 2, 4, 5, 2, 4, 7, 5]
     * j的大小是 ---> 6
     * 此时数组排序状况是 : [1, 2, 4, 5, 2, 4, 7, 5]
     * j的大小是 ---> 7
     * 此时数组排序状况是 : [1, 2, 4, 5, 2, 4, 7, 5]
     * i的大小是 -----------> 2
     * j的大小是 ---> 3
     * 此时数组排序状况是 : [1, 2, 4, 5, 2, 4, 7, 5]
     * j的大小是 ---> 4
     * 此时数组排序状况是 : [1, 2, 2, 5, 4, 4, 7, 5]
     * j的大小是 ---> 5
     * 此时数组排序状况是 : [1, 2, 2, 5, 4, 4, 7, 5]
     * j的大小是 ---> 6
     * 此时数组排序状况是 : [1, 2, 2, 5, 4, 4, 7, 5]
     * j的大小是 ---> 7
     * 此时数组排序状况是 : [1, 2, 2, 5, 4, 4, 7, 5]
     * i的大小是 -----------> 3
     * j的大小是 ---> 4
     * 此时数组排序状况是 : [1, 2, 2, 4, 5, 4, 7, 5]
     * j的大小是 ---> 5
     * 此时数组排序状况是 : [1, 2, 2, 4, 5, 4, 7, 5]
     * j的大小是 ---> 6
     * 此时数组排序状况是 : [1, 2, 2, 4, 5, 4, 7, 5]
     * j的大小是 ---> 7
     * 此时数组排序状况是 : [1, 2, 2, 4, 5, 4, 7, 5]
     * i的大小是 -----------> 4
     * j的大小是 ---> 5
     * 此时数组排序状况是 : [1, 2, 2, 4, 4, 5, 7, 5]
     * j的大小是 ---> 6
     * 此时数组排序状况是 : [1, 2, 2, 4, 4, 5, 7, 5]
     * j的大小是 ---> 7
     * 此时数组排序状况是 : [1, 2, 2, 4, 4, 5, 7, 5]
     * i的大小是 -----------> 5
     * j的大小是 ---> 6
     * 此时数组排序状况是 : [1, 2, 2, 4, 4, 5, 7, 5]
     * j的大小是 ---> 7
     * 此时数组排序状况是 : [1, 2, 2, 4, 4, 5, 7, 5]
     * i的大小是 -----------> 6
     * j的大小是 ---> 7
     * 此时数组排序状况是 : [1, 2, 2, 4, 4, 5, 5, 7]
     * i的大小是 -----------> 7
     * 总共统计的次数是 : 28
     * 排序完的顺序是 : [1, 2, 2, 4, 4, 5, 5, 7]
     */
    @Test
    public void xuanzeTest(){
        int[] arr = {1,4,2,5,2,4,7,5};
        xuanze(arr);
        System.out.println("排序完的顺序是 : " + Arrays.toString(arr));
    }

    /**
     * 选择排序法
     * @param arr
     */
    public void xuanze(int[] arr){
        int size = arr.length;
        int count = 0;
        for (int i = 0; i < size; i++) {
            System.out.println("i的大小是 -----------> " + i);
            for (int j = i + 1; j < size; j++) {
                System.out.println("j的大小是 ---> " + j);
                count++;
                if (arr[i] > arr[j]){
                    swap(arr,i,j);
                }
                System.out.println("此时数组排序状况是 : " + Arrays.toString(arr));
            }
        }
        System.out.println("总共统计的次数是 : " + count);
    }

    /**
     * 数组内容进行交换
     * @param arr
     * @param x
     * @param y
     */
    public void swap(int[] arr,int x,int y){
        int temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
}
